{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应 `tf.keras` 的01~02章节"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:46.436178Z",
     "start_time": "2025-02-22T09:32:46.428524Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu118\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "source": [
    "28*28"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:46.648259Z",
     "start_time": "2025-02-22T09:32:46.639575Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.611146Z",
     "start_time": "2025-02-22T09:32:46.676188Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.622208Z",
     "start_time": "2025-02-22T09:32:50.613814Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "source": [
    "len(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.632404Z",
     "start_time": "2025-02-22T09:32:50.624205Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.652355Z",
     "start_time": "2025-02-22T09:32:50.636396Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.665906Z",
     "start_time": "2025-02-22T09:32:50.654860Z"
    }
   },
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]\n",
    "img.shape\n",
    "# img.shape = (1, 28, 28)，这是因为通道数在最前面"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.680556Z",
     "start_time": "2025-02-22T09:32:50.669286Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) #tensor中文是 张量,和numpy的ndarray类似",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "source": "img[0]",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.720198Z",
     "start_time": "2025-02-22T09:32:50.683554Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:32:50.743142Z",
     "start_time": "2025-02-22T09:32:50.722197Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510,\n",
       "          0.2863, 0.0000, 0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333,\n",
       "          0.4980, 0.2431, 0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118,\n",
       "          0.0157, 0.0000, 0.0000, 0.0118],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000,\n",
       "          0.6902, 0.5255, 0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0471, 0.0392, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255,\n",
       "          0.8118, 0.6980, 0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902,\n",
       "          0.3020, 0.5098, 0.2824, 0.0588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745,\n",
       "          0.8549, 0.8471, 0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725,\n",
       "          0.5529, 0.3451, 0.6745, 0.2588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098,\n",
       "          0.9137, 0.8980, 0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980,\n",
       "          0.4824, 0.7686, 0.8980, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471,\n",
       "          0.8745, 0.8941, 0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667,\n",
       "          0.8745, 0.9608, 0.6784, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549,\n",
       "          0.8353, 0.7765, 0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745,\n",
       "          0.8627, 0.9529, 0.7922, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314,\n",
       "          0.8549, 0.7529, 0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314,\n",
       "          0.8863, 0.7725, 0.8196, 0.2039],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627,\n",
       "          0.8549, 0.7961, 0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627,\n",
       "          0.9608, 0.4667, 0.6549, 0.2196],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020,\n",
       "          0.8941, 0.9412, 0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510,\n",
       "          0.8510, 0.8196, 0.3608, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745,\n",
       "          0.8706, 0.8588, 0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431,\n",
       "          0.8549, 1.0000, 0.3020, 0.0000],\n",
       "         [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667,\n",
       "          0.8549, 0.8157, 0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431,\n",
       "          0.8784, 0.9569, 0.6235, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196,\n",
       "          0.7412, 0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039,\n",
       "          0.8275, 0.9020, 0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725,\n",
       "          0.9137, 0.9333, 0.8431, 0.0000],\n",
       "         [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157,\n",
       "          0.8000, 0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569,\n",
       "          0.8078, 0.8745, 1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275,\n",
       "          0.8627, 0.9098, 0.9647, 0.0000],\n",
       "         [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392,\n",
       "          0.8039, 0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000,\n",
       "          0.8980, 0.8667, 0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196,\n",
       "          0.8706, 0.8941, 0.8824, 0.0000],\n",
       "         [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176,\n",
       "          0.9765, 0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863,\n",
       "          0.4157, 0.4588, 0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745,\n",
       "          0.8745, 0.8784, 0.8980, 0.1137],\n",
       "         [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824,\n",
       "          0.8471, 0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647,\n",
       "          0.8902, 0.9608, 0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706,\n",
       "          0.8627, 0.8667, 0.9020, 0.2627],\n",
       "         [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451,\n",
       "          0.7608, 0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255,\n",
       "          0.8824, 0.8471, 0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745,\n",
       "          0.7098, 0.8039, 0.8078, 0.4510],\n",
       "         [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686,\n",
       "          0.8000, 0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686,\n",
       "          0.7608, 0.7490, 0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118,\n",
       "          0.6549, 0.6941, 0.8235, 0.3608],\n",
       "         [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745,\n",
       "          0.6863, 0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765,\n",
       "          0.8000, 0.8196, 0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608,\n",
       "          0.7529, 0.8471, 0.6667, 0.0000],\n",
       "         [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294,\n",
       "          0.9373, 0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569,\n",
       "          0.7490, 0.7020, 0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588,\n",
       "          0.3882, 0.2275, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569,\n",
       "          0.2392, 0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000]]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2))\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:33:03.787143Z",
     "start_time": "2025-02-22T09:32:50.746138Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "source": [
    "type(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:33:03.794283Z",
     "start_time": "2025-02-22T09:33:03.789164Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:33:03.800368Z",
     "start_time": "2025-02-22T09:33:03.795283Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "code",
   "source": [
    "type(img) #tensor中文是 张量,和numpy的ndarray类似"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:33:03.806986Z",
     "start_time": "2025-02-22T09:33:03.801379Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:33:03.814150Z",
     "start_time": "2025-02-22T09:33:03.808276Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:35.846153Z",
     "start_time": "2025-02-22T09:34:35.839944Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: <built-in method size of Tensor object at 0x000001C1120C0690>\n",
      "图像模式: <built-in method mode of Tensor object at 0x000001C1120C0690>\n"
     ]
    }
   ],
   "execution_count": 19
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.753710Z",
     "start_time": "2025-02-22T09:34:35.952240Z"
    }
   },
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label]) # 显示类别名称\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.766828Z",
     "start_time": "2025-02-22T09:34:36.758014Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 21
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.786406Z",
     "start_time": "2025-02-22T09:34:36.768349Z"
    }
   },
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(300, 100),#隐藏层神经元数100\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(100, 10),#输出层神经元数10\n",
    "        )\n",
    "\n",
    "    def forward(self, x): # 前向计算\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits #没有经过softmax,称为logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ],
   "outputs": [],
   "execution_count": 22
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.797444Z",
     "start_time": "2025-02-22T09:34:36.788918Z"
    }
   },
   "source": [
    "# 看看网络结构\n",
    "model"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "cell_type": "code",
   "source": [
    "784*300+300+300*100+100+100*10+10"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.806107Z",
     "start_time": "2025-02-22T09:34:36.799513Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 24
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.813351Z",
     "start_time": "2025-02-22T09:34:36.808105Z"
    }
   },
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数\n",
    "      print(name, param.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 25
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.842340Z",
     "start_time": "2025-02-22T09:34:36.815598Z"
    }
   },
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[ 0.0026,  0.0089, -0.0215,  ..., -0.0157, -0.0110, -0.0091],\n",
       "         [ 0.0112, -0.0211, -0.0255,  ..., -0.0036, -0.0263,  0.0320],\n",
       "         [-0.0029,  0.0115, -0.0248,  ..., -0.0239, -0.0154, -0.0111],\n",
       "         ...,\n",
       "         [-0.0097,  0.0304,  0.0292,  ...,  0.0304, -0.0059,  0.0273],\n",
       "         [-0.0002, -0.0007, -0.0334,  ...,  0.0340,  0.0224, -0.0120],\n",
       "         [ 0.0261, -0.0108,  0.0021,  ..., -0.0085, -0.0304, -0.0074]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 8.6093e-03, -2.4877e-02,  2.6621e-02,  2.9149e-02, -3.0623e-02,\n",
       "          3.9844e-03,  3.2521e-02, -1.9972e-02, -1.7989e-02, -1.4683e-02,\n",
       "         -3.1277e-02,  9.1794e-03, -1.5022e-02,  9.7283e-03, -2.4046e-02,\n",
       "         -1.0173e-02,  2.7707e-02, -3.3646e-02, -1.9933e-02,  1.8853e-02,\n",
       "          2.1390e-02,  2.7382e-02, -9.7480e-03,  1.2809e-02,  3.1961e-02,\n",
       "         -3.1063e-02, -1.7926e-02,  2.0389e-02, -2.8371e-02,  3.1670e-02,\n",
       "         -2.7264e-03,  3.1966e-02, -1.5235e-02, -2.4131e-02,  2.6365e-02,\n",
       "          2.1760e-02,  3.7312e-03, -2.2730e-03, -8.2535e-04, -2.7032e-02,\n",
       "          2.0941e-02,  7.2184e-03, -2.4916e-02, -6.8174e-03, -8.4382e-03,\n",
       "         -3.5607e-02, -9.6935e-03, -1.6514e-03, -2.9239e-02, -2.9024e-02,\n",
       "          5.9152e-04,  1.7039e-02, -3.0851e-02,  2.0677e-02,  1.9117e-02,\n",
       "          2.8629e-02,  2.0609e-02,  3.1364e-02,  2.2023e-02, -2.9098e-02,\n",
       "          5.2024e-03,  1.7540e-02,  2.9792e-02, -2.7027e-02, -1.8887e-02,\n",
       "         -3.0467e-02, -2.9251e-02,  2.8639e-02, -6.0403e-03,  3.0343e-02,\n",
       "          3.0900e-02, -3.3337e-02,  2.8966e-02, -2.2296e-02, -1.8020e-02,\n",
       "         -1.6936e-04,  1.4693e-02, -2.6087e-02,  1.6394e-02,  2.6766e-02,\n",
       "         -2.8960e-02,  9.7594e-03, -3.1994e-02, -7.8650e-03, -9.8242e-03,\n",
       "         -1.0717e-02,  4.0847e-03,  3.1956e-02, -2.5910e-02, -7.5567e-04,\n",
       "         -3.1390e-02, -3.5162e-02,  2.6421e-02,  3.0723e-02,  1.8074e-02,\n",
       "          1.7280e-02,  5.9642e-03, -2.9556e-02,  2.8558e-02, -1.3106e-02,\n",
       "          2.4576e-02,  3.0429e-03,  3.1663e-02, -1.7387e-02,  1.4060e-02,\n",
       "         -2.5570e-02,  2.8866e-02, -1.6509e-03, -1.0279e-03,  2.9904e-02,\n",
       "         -2.2113e-02,  3.4724e-02,  2.5555e-02,  2.4108e-02, -3.1937e-04,\n",
       "          6.0863e-03,  1.5674e-02,  3.6118e-03, -1.5223e-02, -9.2089e-03,\n",
       "          3.1685e-02,  1.3868e-02, -3.6259e-03, -8.6166e-03,  7.7418e-03,\n",
       "         -2.3663e-02, -1.4678e-02,  1.0834e-02, -3.4882e-02, -1.4765e-03,\n",
       "          1.0559e-02,  1.1014e-03,  1.9383e-02,  7.7969e-04, -1.4460e-03,\n",
       "          1.4919e-02, -6.6923e-03, -5.8952e-03,  1.2874e-02, -2.2511e-02,\n",
       "         -3.2470e-02, -1.0634e-02, -1.4315e-02, -2.2874e-02,  1.4668e-02,\n",
       "          2.7651e-02,  2.4025e-02, -2.5305e-02,  1.4419e-02, -1.7250e-03,\n",
       "         -2.0826e-02, -5.2371e-04, -2.6002e-02, -1.6225e-02,  8.0699e-03,\n",
       "          2.8093e-02,  1.9389e-02, -1.6608e-02,  1.6420e-02,  2.3345e-02,\n",
       "          2.4763e-02, -7.1251e-03,  4.9919e-07,  2.8463e-02, -3.5441e-02,\n",
       "         -2.3297e-02, -1.8088e-02,  3.4673e-02, -2.6862e-02,  7.2021e-03,\n",
       "          1.3170e-02, -2.1644e-02, -2.5063e-02,  2.4148e-02, -4.7038e-03,\n",
       "          3.3862e-02, -3.3303e-02,  1.5576e-02, -1.7164e-02,  2.2127e-02,\n",
       "         -1.1688e-02,  1.4414e-02, -2.4075e-02, -9.9752e-03, -2.2958e-02,\n",
       "         -2.9488e-03,  3.5617e-02,  9.2759e-03, -3.3855e-03,  1.5421e-02,\n",
       "         -2.9034e-02, -1.6866e-02, -1.4239e-02,  1.3070e-02,  1.2775e-02,\n",
       "         -3.1463e-02, -5.0393e-03, -1.8516e-02,  1.4512e-02,  1.1219e-02,\n",
       "          3.4692e-02, -3.2252e-02, -1.9270e-03,  2.9344e-02, -3.0786e-02,\n",
       "          2.6164e-02,  1.9590e-02,  1.8462e-02, -7.0988e-03,  2.7465e-02,\n",
       "          2.2143e-02,  1.0332e-02,  6.2982e-03,  9.2092e-03,  2.1630e-02,\n",
       "          2.8473e-02,  1.6615e-02, -2.0440e-02, -3.1608e-02, -2.0138e-02,\n",
       "          7.0127e-03, -1.5113e-02, -9.4854e-04, -4.6263e-03, -2.6251e-02,\n",
       "         -6.3792e-03, -1.9233e-02,  2.4216e-02, -1.0432e-02, -3.1327e-02,\n",
       "         -8.9519e-03,  3.0114e-03, -1.9193e-03,  3.3473e-02,  2.8017e-02,\n",
       "          1.4688e-02,  3.7000e-04,  2.9821e-02, -1.4709e-02,  3.5625e-02,\n",
       "         -7.1808e-03,  7.8161e-03, -6.8404e-03, -2.4195e-02,  5.2788e-03,\n",
       "          3.0182e-03,  2.0702e-02,  3.1299e-02, -2.8780e-02, -9.1789e-03,\n",
       "         -2.3809e-02, -2.1355e-02, -7.6233e-03,  2.9323e-02,  2.5208e-02,\n",
       "         -2.8317e-02, -8.0112e-03, -1.1775e-02, -1.5186e-02, -1.4681e-02,\n",
       "         -2.6508e-02,  2.3569e-02,  3.1733e-02,  1.1200e-02, -2.1845e-02,\n",
       "          1.8249e-02,  1.5667e-02,  1.9407e-02, -3.5088e-02, -1.3313e-02,\n",
       "          1.5334e-02, -1.4373e-02,  1.3691e-02, -1.6705e-02, -1.7550e-02,\n",
       "          1.8053e-03,  3.0592e-02,  1.1193e-03,  3.2135e-02,  1.7779e-02,\n",
       "         -2.6528e-02, -1.1301e-02,  2.0892e-02, -1.8830e-02, -1.4540e-03,\n",
       "          2.5468e-02, -3.1247e-03,  3.5442e-03,  1.3981e-02,  9.6246e-03,\n",
       "         -9.7306e-03, -9.5412e-03,  1.9641e-02, -3.3615e-02, -1.2530e-02,\n",
       "          2.7021e-02,  7.6074e-03,  2.6638e-03, -3.4991e-02, -3.8266e-03],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-0.0439, -0.0201,  0.0177,  ...,  0.0255, -0.0152, -0.0565],\n",
       "         [-0.0016, -0.0506, -0.0310,  ..., -0.0342, -0.0381, -0.0010],\n",
       "         [-0.0480, -0.0507,  0.0143,  ...,  0.0286, -0.0033, -0.0159],\n",
       "         ...,\n",
       "         [ 0.0255, -0.0202,  0.0215,  ...,  0.0098, -0.0555,  0.0301],\n",
       "         [ 0.0460,  0.0144,  0.0477,  ..., -0.0114,  0.0060, -0.0162],\n",
       "         [ 0.0092, -0.0344,  0.0134,  ..., -0.0276,  0.0239,  0.0006]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0498, -0.0170,  0.0406, -0.0140, -0.0357,  0.0324,  0.0161,  0.0446,\n",
       "          0.0051, -0.0432,  0.0169, -0.0055, -0.0424,  0.0042,  0.0233,  0.0292,\n",
       "         -0.0469,  0.0465, -0.0459,  0.0333,  0.0330, -0.0103,  0.0432, -0.0315,\n",
       "         -0.0526, -0.0434, -0.0131, -0.0426, -0.0088,  0.0426, -0.0469,  0.0340,\n",
       "          0.0061, -0.0482,  0.0227, -0.0304, -0.0433,  0.0027, -0.0336,  0.0200,\n",
       "          0.0263, -0.0061, -0.0137,  0.0036, -0.0140,  0.0438, -0.0058, -0.0023,\n",
       "         -0.0166, -0.0507, -0.0088, -0.0472,  0.0200,  0.0215,  0.0325, -0.0288,\n",
       "         -0.0010, -0.0186, -0.0441, -0.0341, -0.0570,  0.0028,  0.0525, -0.0491,\n",
       "          0.0159,  0.0306,  0.0278, -0.0372, -0.0432, -0.0103, -0.0553, -0.0240,\n",
       "          0.0232, -0.0232,  0.0317, -0.0185, -0.0154,  0.0570, -0.0101, -0.0389,\n",
       "          0.0143, -0.0235, -0.0159,  0.0123,  0.0402,  0.0459, -0.0164, -0.0444,\n",
       "         -0.0422, -0.0490,  0.0044,  0.0388,  0.0537, -0.0231,  0.0423, -0.0250,\n",
       "          0.0452, -0.0235,  0.0029, -0.0543], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-8.7664e-02, -2.5751e-02, -6.0940e-02,  7.1601e-02,  2.8185e-02,\n",
       "          -8.6286e-02, -8.9282e-03, -8.3404e-02,  1.0698e-02, -3.0076e-02,\n",
       "           3.2362e-02,  2.1639e-02,  2.4299e-02, -2.6343e-02, -8.4722e-02,\n",
       "           6.8587e-02,  2.3885e-02,  7.8101e-02,  2.7859e-02,  2.8980e-02,\n",
       "           3.7197e-02,  3.0958e-02,  1.0836e-02,  5.2541e-02, -9.6094e-02,\n",
       "           5.5405e-02, -3.8058e-03, -1.4558e-02,  8.2699e-02,  6.2003e-02,\n",
       "          -7.5635e-02, -6.3639e-02, -9.6139e-02, -4.5878e-02, -1.9770e-02,\n",
       "          -5.2380e-02,  1.0839e-02,  7.8453e-02, -8.9844e-02,  1.6944e-02,\n",
       "           2.3690e-02,  6.0315e-02,  8.5387e-02,  7.0482e-02,  5.0273e-02,\n",
       "          -4.8822e-03, -4.9089e-02, -6.8353e-02,  5.8459e-02,  1.4089e-02,\n",
       "           5.7357e-02, -3.9645e-02, -3.0291e-02, -9.4881e-02, -2.0677e-02,\n",
       "           7.1251e-02, -5.0102e-02,  5.8827e-02, -5.5536e-02, -3.5995e-02,\n",
       "          -9.8936e-02, -8.2937e-02,  4.3674e-02,  5.7309e-02, -3.9110e-02,\n",
       "          -4.3560e-02,  5.0551e-02, -8.5475e-02, -9.1769e-02, -3.6635e-02,\n",
       "           8.5771e-02, -8.5654e-02, -5.4428e-02,  2.8857e-02, -8.3138e-02,\n",
       "           8.6558e-02, -6.3961e-02,  5.6377e-02,  1.4249e-02,  9.6075e-02,\n",
       "          -6.7809e-02, -3.5554e-02,  7.3618e-02,  2.9508e-02,  5.3774e-03,\n",
       "          -5.6422e-02, -4.4895e-02,  3.8756e-02,  8.9527e-03,  5.9218e-03,\n",
       "           3.5781e-02, -9.7463e-02,  1.7553e-02, -6.7546e-02, -3.2365e-02,\n",
       "           5.2944e-02,  9.2552e-02, -6.5627e-02,  6.1390e-02,  4.4627e-02],\n",
       "         [ 1.6555e-02,  5.9895e-02,  3.4460e-02, -3.6102e-02, -4.0491e-03,\n",
       "           1.4409e-02, -4.2038e-02,  6.9106e-02, -7.2017e-02,  7.4048e-02,\n",
       "          -2.0836e-02,  8.5571e-02,  5.0500e-03, -7.1690e-02, -4.3771e-02,\n",
       "           5.2648e-02, -8.7949e-02,  9.2640e-02, -5.9096e-02, -2.6250e-02,\n",
       "           8.3701e-02, -4.9332e-02, -3.3333e-02, -1.0806e-02,  3.2963e-02,\n",
       "          -5.9889e-02,  7.8237e-04,  5.2416e-02, -9.4216e-02,  5.7215e-02,\n",
       "          -1.9790e-02, -1.5195e-02, -8.3644e-02,  3.9743e-02,  4.9193e-02,\n",
       "          -2.3257e-02,  7.4491e-03,  8.0318e-02, -7.5441e-02, -1.6517e-02,\n",
       "           2.1611e-02, -4.1706e-02,  5.3069e-02, -9.2642e-02, -1.5101e-02,\n",
       "           5.6411e-02,  8.4970e-02, -2.3720e-02,  3.3234e-02, -9.4982e-02,\n",
       "          -7.2732e-02,  3.1978e-02, -5.2507e-03,  8.8350e-03,  4.0288e-03,\n",
       "          -4.1908e-02, -3.8664e-02, -6.3994e-02, -7.7045e-02, -5.1856e-02,\n",
       "           7.4947e-02,  8.0886e-02, -2.4389e-02,  9.7822e-02, -3.3534e-02,\n",
       "           4.3623e-03, -3.8120e-02, -1.7383e-02,  1.9851e-03,  2.1884e-02,\n",
       "          -3.8511e-02,  5.1303e-03,  6.7573e-03,  8.3372e-02,  6.2299e-02,\n",
       "          -7.1377e-02,  9.6028e-02, -1.4068e-02, -3.3015e-02, -2.2053e-02,\n",
       "          -3.3206e-02, -9.2948e-02, -5.3332e-02,  2.9242e-02,  2.2833e-02,\n",
       "          -7.2187e-02, -8.7799e-02,  4.5035e-02,  4.7323e-02,  6.3574e-02,\n",
       "           9.8827e-03,  9.0588e-02,  3.0728e-02, -7.2188e-02,  8.2971e-02,\n",
       "          -9.1075e-02,  3.7135e-02,  9.6786e-02, -3.7797e-02,  4.3232e-02],\n",
       "         [-3.6196e-02, -3.1567e-02, -1.8538e-02, -1.9174e-02,  2.6994e-02,\n",
       "          -2.0385e-02,  2.1438e-02, -4.7583e-02,  2.6587e-03, -7.6873e-02,\n",
       "          -7.2567e-02,  8.2348e-03, -5.3927e-03,  5.2986e-02, -5.1383e-02,\n",
       "           8.4342e-02,  3.7185e-02,  1.3254e-02,  6.9889e-02, -3.1636e-02,\n",
       "          -1.8574e-02, -4.6471e-02,  3.2508e-02, -6.7702e-02,  9.3689e-03,\n",
       "           5.2447e-02, -8.9016e-02,  3.9538e-02, -2.8013e-02, -3.0053e-02,\n",
       "           8.7754e-02, -4.1363e-02,  1.7939e-02,  5.6282e-03, -8.5298e-02,\n",
       "          -9.9261e-02,  3.0336e-02, -4.1202e-02, -6.9368e-02,  9.4266e-02,\n",
       "           8.2362e-02,  9.1707e-02, -2.3753e-02,  1.1473e-02,  1.6916e-02,\n",
       "          -4.1580e-02, -5.7821e-02, -2.6406e-02, -1.7000e-02, -3.8265e-02,\n",
       "          -6.1669e-02, -9.1028e-02,  6.5750e-02, -6.8143e-03,  8.0151e-02,\n",
       "          -7.6840e-03,  2.5735e-03, -4.8101e-02,  3.5018e-02,  3.1384e-02,\n",
       "           3.9273e-02,  9.9472e-02,  1.6344e-02,  5.2937e-02, -6.7686e-03,\n",
       "          -5.2256e-02,  4.2420e-02, -6.0693e-02,  2.5681e-02,  5.3042e-02,\n",
       "           2.9463e-03, -7.7744e-02,  7.1234e-03, -6.2371e-02,  9.6990e-02,\n",
       "           2.6325e-02,  8.9765e-02, -5.6030e-03, -9.7231e-02, -7.8714e-02,\n",
       "          -9.7614e-02,  2.8911e-02,  8.7882e-02,  9.7577e-02, -5.7862e-02,\n",
       "          -5.7035e-02, -1.0043e-02,  7.8583e-03,  5.7801e-03, -3.7553e-03,\n",
       "          -4.9807e-03, -3.3855e-03,  4.9186e-02,  1.7629e-02,  8.9725e-02,\n",
       "          -3.5912e-02,  1.5148e-02,  7.8834e-02,  6.0179e-02,  7.2625e-02],\n",
       "         [-7.9077e-02, -3.0969e-02, -8.1947e-02, -3.7333e-03,  8.2422e-03,\n",
       "           4.9042e-02,  8.7382e-02,  5.6219e-03,  1.5706e-04,  1.4608e-02,\n",
       "           7.9455e-02,  4.7174e-02,  9.0199e-02,  9.0629e-02, -2.7885e-02,\n",
       "           2.0795e-02,  6.8199e-02, -1.0229e-02, -8.6202e-03,  9.1308e-02,\n",
       "          -3.9397e-02,  1.0640e-02,  6.7831e-02,  3.4224e-02,  8.1286e-02,\n",
       "          -3.3159e-02,  3.8947e-02, -5.1435e-02,  3.7456e-02, -3.3592e-02,\n",
       "           6.6091e-02,  4.8477e-02,  4.9657e-02,  3.3556e-02, -9.1735e-02,\n",
       "          -3.4548e-02, -2.2870e-02, -2.1036e-02, -5.8722e-02, -3.1437e-02,\n",
       "           7.7657e-02,  6.3149e-02, -7.0908e-02,  2.8009e-03,  7.0603e-02,\n",
       "           7.9482e-02,  3.0153e-02,  8.0947e-02,  5.6398e-03, -2.0914e-02,\n",
       "          -1.1035e-02,  4.1142e-02, -4.1842e-02,  1.0198e-03, -7.5100e-02,\n",
       "           7.3215e-03,  6.5883e-02, -7.8142e-02, -1.9183e-02, -7.1395e-02,\n",
       "           4.3274e-02, -2.3798e-02,  1.2942e-02, -1.4598e-03, -3.7635e-02,\n",
       "          -4.8015e-02, -7.7852e-02,  6.1102e-02, -7.9263e-02,  8.1150e-02,\n",
       "           6.6350e-02, -8.0136e-02,  8.6865e-02,  6.8963e-02, -9.4059e-02,\n",
       "          -4.5896e-02,  2.1725e-02,  1.1120e-02, -3.8295e-02, -7.7388e-02,\n",
       "          -7.5564e-03,  2.3157e-03, -4.2830e-02,  9.0261e-02, -5.1753e-02,\n",
       "           5.1740e-03,  8.8623e-02,  7.1188e-03, -9.7944e-02, -1.9790e-02,\n",
       "          -7.5793e-03, -7.3394e-02, -5.5511e-02,  2.3752e-02,  2.6074e-02,\n",
       "           9.9045e-02, -3.0572e-03,  1.8041e-02, -8.6185e-02,  9.3131e-02],\n",
       "         [ 8.7503e-02, -5.0710e-02,  2.4129e-02, -8.4956e-02, -7.0134e-03,\n",
       "          -9.2953e-02,  4.4037e-02,  9.2196e-02,  2.3149e-02, -5.5472e-02,\n",
       "          -5.6852e-02, -7.4562e-02,  8.4204e-02, -3.4508e-02, -3.6553e-02,\n",
       "          -1.3265e-02,  6.0399e-03, -6.3980e-02, -7.9459e-02,  3.2959e-02,\n",
       "          -5.8951e-02, -7.8306e-02,  6.8147e-02,  5.5503e-02,  5.5741e-02,\n",
       "           9.2395e-02,  4.0697e-02, -2.1046e-02,  8.6158e-02, -3.4932e-02,\n",
       "          -2.6856e-02, -6.1974e-02,  6.1383e-02, -9.8676e-02, -7.7784e-02,\n",
       "          -1.6005e-02, -4.8579e-02,  5.6196e-02, -7.3307e-02,  5.1995e-02,\n",
       "           2.6127e-02, -2.7014e-02,  7.1931e-02, -1.0262e-02,  4.4030e-02,\n",
       "           9.6641e-04,  6.0403e-02, -4.4593e-02,  6.0889e-02,  2.4130e-02,\n",
       "           8.2971e-02, -4.9023e-03,  9.8803e-02,  6.1488e-02,  6.8095e-02,\n",
       "           8.0706e-02,  1.7220e-02,  1.7045e-02, -2.1930e-02,  9.0497e-02,\n",
       "          -3.3390e-02,  1.1344e-02, -9.8186e-02,  1.7908e-02, -6.4912e-04,\n",
       "           4.4256e-02, -4.0379e-02, -2.8786e-02,  9.2777e-02,  3.4823e-02,\n",
       "          -7.9222e-02,  9.9497e-02,  6.9011e-02,  7.0480e-02, -9.3352e-02,\n",
       "          -1.5656e-02,  5.0053e-02, -3.3284e-02,  5.3822e-02, -8.7557e-02,\n",
       "          -6.7833e-02,  1.6807e-02,  5.3651e-02,  5.8981e-03,  4.1513e-02,\n",
       "           2.5410e-02,  3.1769e-02,  1.7537e-02,  3.4583e-02, -7.8251e-02,\n",
       "           4.6863e-02, -4.5308e-02, -7.1625e-02, -4.8362e-02, -7.8098e-02,\n",
       "           8.8225e-02,  8.9552e-02,  3.9098e-02,  1.7604e-02, -6.7202e-02],\n",
       "         [ 1.5802e-02,  3.9153e-03,  5.5285e-02, -2.0688e-02, -8.1259e-02,\n",
       "           9.4938e-02,  2.8924e-02,  3.9968e-02, -6.0914e-02, -4.0517e-02,\n",
       "           5.9087e-02,  7.8036e-02,  8.5518e-02, -1.5982e-02,  4.4964e-02,\n",
       "           7.5978e-02, -1.9005e-02, -5.8744e-02, -8.6978e-02, -6.6394e-02,\n",
       "           2.7710e-02,  9.4442e-02, -1.0903e-02, -8.1343e-02,  4.3913e-02,\n",
       "          -7.2504e-02, -4.8540e-02,  8.8665e-02,  1.5874e-02, -6.0015e-02,\n",
       "           8.6923e-02, -6.5791e-03, -3.1643e-02,  9.8707e-04,  3.7601e-02,\n",
       "          -3.1194e-02,  8.0613e-02,  6.8568e-02, -8.0884e-02, -5.4572e-02,\n",
       "          -6.4309e-02, -4.4840e-02, -7.3623e-02,  7.4358e-02,  9.6409e-02,\n",
       "          -5.3541e-03, -4.8079e-02,  9.5995e-02,  6.0063e-02,  2.4478e-02,\n",
       "          -9.4600e-02, -9.7517e-02,  4.6584e-02, -5.5265e-02, -6.0355e-02,\n",
       "           5.2628e-02,  5.5886e-03,  2.5161e-02,  4.8295e-02, -5.7879e-02,\n",
       "          -3.4516e-02, -4.7332e-03,  4.4415e-02,  7.3755e-02, -8.3510e-02,\n",
       "          -3.9732e-03, -6.3369e-02,  5.2111e-02, -6.2937e-02, -1.1716e-02,\n",
       "           2.6653e-02, -3.0258e-02,  2.4382e-03,  1.6440e-02, -7.3311e-02,\n",
       "           5.8141e-03,  5.1212e-02, -1.1271e-02, -5.6295e-02,  8.4427e-02,\n",
       "           9.6800e-02,  5.0959e-02, -5.5423e-02,  9.5315e-02,  5.3469e-02,\n",
       "           9.8868e-02, -9.4564e-02,  1.6741e-02, -5.6785e-02, -4.8047e-02,\n",
       "           1.0250e-02,  8.3646e-02,  7.1948e-02, -2.4754e-02, -8.2358e-04,\n",
       "          -7.1866e-03,  7.5291e-02, -3.9354e-02, -4.1552e-02, -2.7782e-02],\n",
       "         [ 7.3837e-02,  5.4337e-02,  2.0837e-02, -6.7003e-02,  7.8515e-02,\n",
       "           4.1543e-02, -1.0527e-02, -3.3744e-02,  8.7001e-02, -5.8007e-02,\n",
       "          -7.5978e-02,  8.2288e-02,  9.1021e-02, -2.4793e-03,  2.0194e-02,\n",
       "          -6.9613e-02, -8.4220e-02,  6.0990e-02,  7.9080e-02, -6.8590e-02,\n",
       "          -8.5292e-02, -8.1646e-02, -6.7274e-02,  4.5242e-02,  8.7868e-02,\n",
       "          -1.3716e-02,  3.7153e-02, -5.8547e-02, -5.2803e-02,  4.2523e-02,\n",
       "          -7.4976e-02,  3.8014e-02, -8.3681e-02,  1.6265e-02,  5.4811e-02,\n",
       "          -6.8225e-03,  9.1775e-02,  6.9765e-02, -4.5640e-02,  7.3023e-02,\n",
       "           3.0594e-02, -7.1395e-02,  8.6428e-02,  8.9703e-02, -1.3383e-02,\n",
       "           6.1012e-02, -4.3607e-02, -3.7811e-02, -7.0982e-02, -7.3728e-03,\n",
       "          -7.4951e-02, -2.6167e-02,  7.3297e-03, -8.3569e-02,  9.6606e-03,\n",
       "           8.5879e-02, -3.0011e-02,  6.1279e-02,  8.5081e-02, -9.5767e-03,\n",
       "          -2.8435e-02,  1.7753e-02, -2.4697e-03,  9.8833e-02,  6.2788e-02,\n",
       "          -7.1735e-02, -6.0951e-03, -7.7374e-02, -5.2745e-02,  9.7110e-02,\n",
       "          -6.2596e-02, -1.8282e-02,  1.4212e-02, -3.9162e-02,  7.6993e-02,\n",
       "           2.2700e-02, -6.7659e-02,  5.1759e-02,  1.1457e-02, -9.3818e-02,\n",
       "          -6.5810e-03, -4.7998e-02, -8.2848e-02, -3.3028e-02, -8.1575e-02,\n",
       "          -9.6051e-02,  3.1404e-02, -4.6243e-02, -1.4126e-02,  7.8016e-02,\n",
       "          -9.8142e-02,  2.6150e-02, -6.2639e-02,  9.9677e-02,  2.6187e-02,\n",
       "          -6.0405e-02, -1.1270e-02,  3.0679e-02,  9.1059e-02,  8.0569e-02],\n",
       "         [-2.5977e-02,  1.6671e-03,  9.3539e-02, -8.5790e-02, -1.0326e-02,\n",
       "           6.7845e-02, -4.2772e-02, -4.7169e-02,  4.1978e-02,  2.6880e-02,\n",
       "           7.8322e-02, -8.1226e-02, -8.9005e-02,  4.4558e-02, -4.1198e-02,\n",
       "           6.7406e-02, -1.1535e-02, -4.9755e-05,  9.8495e-02,  4.2150e-02,\n",
       "          -4.2931e-02, -3.2112e-02, -3.2909e-02,  3.1661e-02, -5.3793e-02,\n",
       "           2.7455e-02,  1.1387e-02, -9.3871e-02, -4.8620e-02,  7.6715e-02,\n",
       "           5.2492e-02, -7.6846e-02, -7.3432e-03,  9.2749e-02, -4.7967e-02,\n",
       "          -6.3671e-02, -2.4932e-02, -4.3588e-02, -6.6169e-02,  4.5797e-02,\n",
       "          -1.2369e-02,  7.5557e-02,  4.4611e-02,  1.8835e-02,  1.6990e-02,\n",
       "          -4.0810e-02, -3.9227e-02, -7.6484e-02, -7.7127e-02,  6.8976e-02,\n",
       "          -8.4060e-03, -6.3555e-02, -4.8431e-02, -2.6820e-02, -7.5781e-02,\n",
       "           3.5966e-02, -8.6837e-02,  6.9245e-02, -9.8744e-02, -4.9392e-02,\n",
       "          -1.3642e-02, -4.9130e-02,  7.2345e-02, -4.1595e-02, -7.5498e-02,\n",
       "          -7.6663e-02, -4.4747e-02, -7.6285e-02, -9.8754e-02, -2.2479e-02,\n",
       "          -6.2232e-02, -6.4176e-02, -5.9088e-03,  3.4819e-02, -1.2158e-02,\n",
       "          -7.2707e-03,  8.9046e-02,  7.9279e-02,  2.2917e-02, -5.8223e-02,\n",
       "          -3.6446e-02, -3.4784e-02,  8.0106e-02,  3.1801e-02, -7.8576e-02,\n",
       "          -5.9682e-02, -3.3947e-02,  1.8128e-02, -5.6678e-02,  1.0696e-02,\n",
       "           9.2316e-03, -7.1157e-02, -4.5819e-02,  9.5136e-02, -2.6045e-02,\n",
       "           3.1747e-02, -9.7043e-03, -1.1002e-02, -7.4339e-02, -6.8940e-02],\n",
       "         [ 9.9471e-02,  6.7026e-02, -2.0163e-02,  1.2958e-03, -3.1668e-03,\n",
       "           5.5741e-03, -1.3318e-02,  9.5734e-02, -1.8049e-03, -7.0349e-02,\n",
       "           1.7526e-02, -1.5710e-02,  4.1257e-02,  9.2872e-02, -8.6555e-02,\n",
       "          -3.3168e-02, -9.4176e-02, -4.1428e-02, -5.3425e-02, -2.4028e-02,\n",
       "           4.2566e-02, -7.9785e-02,  9.4595e-02,  9.9290e-02, -3.0508e-02,\n",
       "          -3.9308e-02,  2.4585e-02,  5.7182e-02,  9.0066e-02,  6.1107e-02,\n",
       "          -6.1702e-02, -6.4551e-02, -2.9272e-02,  6.6755e-02,  6.4034e-02,\n",
       "           2.5381e-02,  4.5668e-03,  9.2851e-02, -3.3768e-02, -3.3513e-02,\n",
       "           8.5019e-02, -6.0270e-02, -4.1983e-02,  8.2712e-02, -5.4170e-02,\n",
       "           4.7508e-02,  1.9110e-02,  5.1815e-02, -6.5334e-02, -1.9629e-02,\n",
       "          -6.6382e-02,  7.0844e-02,  4.9725e-02,  9.2756e-02, -6.7371e-02,\n",
       "          -6.3053e-02, -1.6616e-02,  1.0919e-02,  3.8327e-02,  7.5740e-02,\n",
       "          -6.9948e-02, -4.6659e-02,  2.3598e-02,  5.6772e-03,  9.1388e-02,\n",
       "          -8.2670e-02,  1.0277e-03,  3.8318e-02,  7.5453e-02, -9.6845e-02,\n",
       "          -1.9981e-02, -5.7685e-02,  5.2052e-02, -1.2730e-02, -3.5830e-02,\n",
       "           4.2974e-02, -5.4959e-02, -2.2020e-03, -6.8470e-02, -7.6241e-02,\n",
       "          -5.0967e-02,  9.6752e-02, -4.7031e-02, -6.5777e-02, -3.9819e-02,\n",
       "          -3.3271e-02,  2.5384e-02,  9.4743e-03,  1.9470e-02,  1.8905e-02,\n",
       "          -2.8178e-02, -4.5375e-02, -2.7989e-02, -3.8070e-02, -7.2891e-02,\n",
       "           7.0287e-02, -5.4645e-02, -9.0059e-02,  2.0749e-02,  4.4061e-02],\n",
       "         [ 9.7385e-02,  5.3525e-02,  9.3766e-03, -5.2310e-02, -3.7059e-02,\n",
       "           1.8436e-02, -1.2022e-03, -3.4050e-02,  8.7750e-03, -1.6016e-02,\n",
       "           3.5429e-02, -4.7140e-02, -5.4163e-02, -6.3141e-02,  6.9290e-02,\n",
       "           9.9277e-02,  4.5929e-02, -9.7035e-02,  3.9600e-02, -3.6128e-02,\n",
       "           3.5536e-03, -2.6412e-02,  5.4269e-02, -7.4221e-02, -4.2292e-02,\n",
       "          -2.9514e-02, -3.6833e-03, -7.3129e-02, -9.1768e-02, -9.6979e-02,\n",
       "           4.0307e-03,  8.5861e-02,  3.8200e-03,  9.8087e-02,  5.3589e-02,\n",
       "           4.8824e-02, -5.5765e-02, -4.3277e-02, -5.7184e-02,  6.2003e-02,\n",
       "          -3.9803e-02, -9.0016e-02,  4.8583e-02,  5.9577e-02, -3.1590e-02,\n",
       "          -9.5272e-02, -9.9464e-02,  2.6054e-02,  6.0223e-02,  3.5887e-02,\n",
       "           3.8609e-02,  6.3597e-03, -2.1838e-02, -3.9675e-02, -2.5589e-02,\n",
       "          -6.1881e-02, -4.5498e-02, -1.4291e-02,  2.1814e-02, -2.2033e-03,\n",
       "           2.7709e-02,  2.9331e-02, -7.5601e-03, -8.0501e-02, -4.6865e-02,\n",
       "          -1.0728e-02, -4.3415e-02,  3.2876e-02, -5.3316e-02,  4.9808e-02,\n",
       "           8.2889e-02,  8.1106e-02, -1.0121e-02,  2.5625e-03,  7.0794e-03,\n",
       "          -2.5921e-02, -5.8259e-02,  4.3049e-02,  4.2418e-02, -9.1541e-02,\n",
       "           5.2331e-02, -7.5887e-02, -3.4264e-02,  4.1262e-02, -1.6122e-02,\n",
       "          -3.1418e-02,  1.9298e-02,  5.8256e-02, -5.9087e-02, -2.4748e-02,\n",
       "          -2.1720e-02,  6.1589e-02, -3.2378e-02, -3.5032e-03, -4.7889e-02,\n",
       "           6.5264e-02, -8.7459e-02, -9.3527e-03, -2.3311e-02, -6.3870e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0083, -0.0556, -0.0060,  0.0723, -0.0092, -0.0063, -0.0409,  0.0936,\n",
       "         -0.0259, -0.0118], requires_grad=True)]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 26
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.848744Z",
     "start_time": "2025-02-22T09:34:36.844381Z"
    }
   },
   "source": [
    "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ],
   "outputs": [],
   "execution_count": 27
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:36.857257Z",
     "start_time": "2025-02-22T09:34:36.849760Z"
    }
   },
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "outputs": [],
   "execution_count": 28
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:37.003258Z",
     "start_time": "2025-02-22T09:34:36.860318Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = [] # 记录损失\n",
    "    pred_list = [] # 记录预测\n",
    "    label_list = [] # 记录标签\n",
    "    for datas, labels in dataloader:#10000/32=312\n",
    "        datas = datas.to(device) # 转到GPU\n",
    "        labels = labels.to(device) # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # 记录损失\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 29
  },
  {
   "cell_type": "code",
   "source": [
    "1875*20"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:34:37.011112Z",
     "start_time": "2025-02-22T09:34:37.005256Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 30
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:42:22.027314Z",
     "start_time": "2025-02-22T09:34:37.012282Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
    "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1) # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval() # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20 #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "0e079cc7bf774585b13b8b40c3b02ca9"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 31
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:42:22.058927Z",
     "start_time": "2025-02-22T09:42:22.036823Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.1652883142232895, 'acc': 0.96875, 'step': 37495},\n",
       " {'loss': 0.28197598457336426, 'acc': 0.90625, 'step': 37496},\n",
       " {'loss': 0.29950278997421265, 'acc': 0.9375, 'step': 37497},\n",
       " {'loss': 0.2545042037963867, 'acc': 0.90625, 'step': 37498},\n",
       " {'loss': 0.2951190769672394, 'acc': 0.875, 'step': 37499}]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 32
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-22T09:42:22.068876Z",
     "start_time": "2025-02-22T09:42:22.060431Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.3711980759811858, 'acc': 0.868, 'step': 33000},\n",
       " {'loss': 0.3626020681053495, 'acc': 0.8694, 'step': 34000},\n",
       " {'loss': 0.35855775519300953, 'acc': 0.8712, 'step': 35000},\n",
       " {'loss': 0.3614067620814989, 'acc': 0.8724, 'step': 36000},\n",
       " {'loss': 0.35263888640239976, 'acc': 0.8744, 'step': 37000}]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 33
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:42:22.395858Z",
     "start_time": "2025-02-22T09:42:22.071909Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.00000\n",
      "1000     0.81250\n",
      "2000     0.84375\n",
      "3000     0.71875\n",
      "4000     0.87500\n",
      "5000     0.75000\n",
      "6000     0.84375\n",
      "7000     0.84375\n",
      "8000     0.81250\n",
      "9000     0.75000\n",
      "10000    0.84375\n",
      "11000    0.81250\n",
      "12000    0.93750\n",
      "13000    0.87500\n",
      "14000    0.90625\n",
      "15000    0.87500\n",
      "16000    0.96875\n",
      "17000    0.87500\n",
      "18000    0.87500\n",
      "19000    0.87500\n",
      "20000    0.87500\n",
      "21000    0.87500\n",
      "22000    0.93750\n",
      "23000    0.93750\n",
      "24000    0.87500\n",
      "25000    0.87500\n",
      "26000    0.93750\n",
      "27000    0.84375\n",
      "28000    0.84375\n",
      "29000    0.96875\n",
      "30000    0.84375\n",
      "31000    0.87500\n",
      "32000    0.90625\n",
      "33000    0.87500\n",
      "34000    0.75000\n",
      "35000    0.93750\n",
      "36000    0.96875\n",
      "37000    0.87500\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.1012\n",
      "1000     0.6873\n",
      "2000     0.7626\n",
      "3000     0.7817\n",
      "4000     0.8167\n",
      "5000     0.8193\n",
      "6000     0.8249\n",
      "7000     0.8226\n",
      "8000     0.8283\n",
      "9000     0.8398\n",
      "10000    0.8349\n",
      "11000    0.8401\n",
      "12000    0.8462\n",
      "13000    0.8452\n",
      "14000    0.8483\n",
      "15000    0.8435\n",
      "16000    0.8512\n",
      "17000    0.8541\n",
      "18000    0.8524\n",
      "19000    0.8574\n",
      "20000    0.8493\n",
      "21000    0.8613\n",
      "22000    0.8577\n",
      "23000    0.8620\n",
      "24000    0.8652\n",
      "25000    0.8642\n",
      "26000    0.8626\n",
      "27000    0.8669\n",
      "28000    0.8649\n",
      "29000    0.8627\n",
      "30000    0.8572\n",
      "31000    0.8634\n",
      "32000    0.8698\n",
      "33000    0.8680\n",
      "34000    0.8694\n",
      "35000    0.8712\n",
      "36000    0.8724\n",
      "37000    0.8744\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 34
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-22T09:42:24.319333Z",
     "start_time": "2025-02-22T09:42:22.396862Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval() # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3526\n",
      "accuracy: 0.8754\n"
     ]
    }
   ],
   "execution_count": 35
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
